// 订单上传接口测试脚本
// 此脚本用于验证新添加的订单上传接口是否正常工作

const axios = require('axios');
const fs = require('fs');
const path = require('path');

// 尝试加载form-data模块，如果安装了的话
let FormData = null;
let formDataAvailable = false;

try {
  FormData = require('form-data');
  formDataAvailable = true;
  console.log('form-data模块已成功加载，可以进行完整的文件上传测试。');
} catch (error) {
  console.log('提示：form-data模块未安装，文件上传测试将使用简化模式。');
  console.log('建议运行：npm install form-data 以进行完整测试。');
}

// 基础URL
const BASE_URL = 'http://localhost:3000/api';

// 模拟登录信息
const mockLoginData = {
  code: 'test_code',
  userInfo: {
    nickName: '测试用户',
    avatarUrl: 'https://example.com/avatar.jpg',
    gender: 1,
    language: 'zh_CN',
    city: '北京',
    province: '北京',
    country: '中国'
  }
};

// 登录获取token
async function login() {
  try {
    console.log('1. 登录获取token...');
    const loginResponse = await axios.post(`${BASE_URL}/user/login`, mockLoginData);
    
    if (!loginResponse.data.success) {
      console.error('登录失败:', loginResponse.data.message);
      return null;
    }
    
    const token = loginResponse.data.token;
    const userInfo = loginResponse.data.data.userInfo;
    console.log('登录成功！获取到的用户信息:', userInfo);
    console.log('登录成功！获取到的token:', token.substring(0, 20) + '...');
    
    return token;
  } catch (error) {
    console.error('登录过程中发生错误:', error.message);
    if (error.response) {
      console.error('错误详情:', error.response.data);
    }
    return null;
  }
}

// 测试订单上传接口（不包含文件）
async function testUploadOrderWithoutFile(token) {
  try {
    console.log('\n2. 测试订单上传接口（不包含文件）...');
    
    // 创建订单数据
    const orderData = {
      goods_id: 1, // 假设商品ID为1的商品存在
      goods_info: JSON.stringify({
        title: '测试商品',
        price: 99.99,
        image: '/test.jpg',
        description: '测试商品描述'
      }),
      quantity: 1,
      payment_type: 'alipay'
    };
    
    // 发送请求
    const response = await axios.post(`${BASE_URL}/order/upload`, orderData, {
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
      },
      validateStatus: false // 不抛出非2xx状态码的错误
    });
    
    console.log('订单上传接口返回状态码:', response.status);
    console.log('订单上传接口返回数据:', response.data);
    
    if (response.status === 200 && response.data.success) {
      console.log('订单上传成功！');
      console.log('创建的订单ID:', response.data.data.id);
      return response.data.data.id; // 返回创建的订单ID
    } else {
      console.error('订单上传失败:', response.data?.message || '未知错误');
      return null;
    }
  } catch (error) {
    console.error('测试订单上传接口（不包含文件）过程中发生错误:', error.message);
    if (error.response) {
      console.error('错误详情:', error.response.data);
    }
    return null;
  }
}

// 测试订单上传接口（包含文件）
async function testUploadOrderWithFile(token) {
  try {
    console.log('\n3. 测试订单上传接口（包含文件）...');
    
    // 创建订单数据
    const orderData = {
      goods_id: 1, // 假设商品ID为1的商品存在
      goods_info: JSON.stringify({
        title: '测试商品',
        price: 99.99,
        image: '/test.jpg',
        description: '测试商品描述'
      }),
      quantity: 1,
      payment_type: 'wechat'
    };
    
    let response;
    let testFilePath;
    
    try {
      if (formDataAvailable) {
        // form-data模块可用，进行完整的文件上传测试
        console.log('使用form-data模块进行完整文件上传测试...');
        
        // 创建一个临时的测试文件
        testFilePath = path.join(__dirname, 'test_proof_of_payment.png');
        
        // 创建一个简单的PNG文件（仅用于测试）
        const pngHeader = Buffer.from([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]);
        fs.writeFileSync(testFilePath, pngHeader);
        
        const form = new FormData();
        form.append('orderData', JSON.stringify(orderData));
        form.append('paymentProof', fs.createReadStream(testFilePath));
        
        // 发送请求
        response = await axios.post(`${BASE_URL}/order/upload`, form, {
          headers: {
            ...form.getHeaders(),
            'Authorization': `Bearer ${token}`
          },
          validateStatus: false // 不抛出非2xx状态码的错误
        });
        
        console.log('完整文件上传测试完成！');
      } else {
        // form-data模块不可用，使用简化模式
        console.log('使用简化模式测试（仅发送订单数据）...');
        
        // 发送请求
        response = await axios.post(`${BASE_URL}/order/upload`, orderData, {
          headers: {
            'Authorization': `Bearer ${token}`,
            'Content-Type': 'application/json'
          },
          validateStatus: false // 不抛出非2xx状态码的错误
        });
        
        console.log('简化模式测试完成！注意：此模式未测试实际文件上传功能。');
        console.log('建议安装form-data模块以进行完整测试：npm install form-data');
      }
      
      console.log('带文件相关的订单上传接口返回状态码:', response.status);
      console.log('带文件相关的订单上传接口返回数据:', response.data);
      
      if (response.status === 200 && response.data.success) {
        console.log('订单上传成功！');
        if (response.data.data?.id) {
          console.log('创建的订单ID:', response.data.data.id);
        }
        return true;
      } else {
        console.error('订单上传失败:', response.data?.message || '未知错误');
        return false;
      }
    } catch (innerError) {
      throw innerError;
    } finally {
      // 删除临时测试文件
      if (testFilePath && fs.existsSync(testFilePath)) {
        fs.unlinkSync(testFilePath);
      }
    }
  } catch (error) {
    console.error('测试订单上传接口（包含文件）过程中发生错误:', error.message);
    if (error.response) {
      console.error('错误详情:', error.response.data);
    }
    return false;
  }
}

// 验证订单是否存在
async function verifyOrderExists(token, orderId) {
  if (!orderId) return false;
  
  try {
    console.log(`\n4. 验证创建的订单（ID: ${orderId}）是否存在...`);
    
    // 获取用户的订单列表，检查是否包含刚刚创建的订单
    const orderResponse = await axios.get(`${BASE_URL}/order`, {
      headers: {
        'Authorization': `Bearer ${token}`
      },
      params: {
        page: 1,
        pageSize: 10
      }
    });
    
    if (!orderResponse.data.success || !orderResponse.data.data?.orders) {
      console.error('获取订单列表失败:', orderResponse.data.message);
      return false;
    }
    
    const orderExists = orderResponse.data.data.orders.some(order => order.id === orderId);
    
    if (orderExists) {
      console.log(`订单（ID: ${orderId}）验证成功！在用户订单列表中找到了该订单。`);
      return true;
    } else {
      console.error(`验证失败：在用户订单列表中未找到订单（ID: ${orderId}）。`);
      return false;
    }
  } catch (error) {
    console.error('验证订单过程中发生错误:', error.message);
    if (error.response) {
      console.error('错误详情:', error.response.data);
    }
    return false;
  }
}

// 主测试函数
async function runTests() {
  try {
    console.log('===== 开始测试订单上传API =====');
    
    // 1. 登录获取token
    const token = await login();
    if (!token) {
      console.error('无法获取token，测试终止。');
      return;
    }
    
    // 2. 测试不包含文件的订单上传
    const orderId = await testUploadOrderWithoutFile(token);
    
    // 3. 验证创建的订单是否存在
    if (orderId) {
      await verifyOrderExists(token, orderId);
    }
    
    // 4. 测试包含文件的订单上传
    await testUploadOrderWithFile(token);
    
    console.log('\n===== 测试完成 =====');
    
  } catch (error) {
    console.error('测试过程中发生错误:', error.message);
    if (error.response) {
      console.error('错误详情:', error.response.data);
    }
  }
}

// 运行测试
runTests();